import { fileURLToPath, URL } from 'node:url'
import vueDevTools from 'vite-plugin-vue-devtools'
import { defineConfig } from 'vite'
import * as vue from '@vitejs/plugin-vue'
import { resolve } from 'path'
import autoprefixer from 'autoprefixer'
import cssnano from 'cssnano'

// https://vitejs.dev/config/
export default defineConfig(({ mode }) => {
  const isProd = mode === 'production'
  
  return {
    plugins: [
      vue.default(),
      vueDevTools(),
    ],
    
    // 开发服务器配置
    server: {
      host: "0.0.0.0",
      port: "3000",
      allowedHosts: true,
      // 启用HMR优化
      hmr: {
        overlay: false // 禁用错误覆盖层以提高性能
      },
      // 简化的代理配置
      proxy: {
        '/api': {
          target: 'http://localhost:8080',
          changeOrigin: true
        }
      }
    },
    
    preview: {
      host: "0.0.0.0",
      port: 3000,
    },
    
    // 路径解析优化
    resolve: {
      alias: {
        '@': fileURLToPath(new URL('./src', import.meta.url)),
        'vue': 'vue/dist/vue.esm-bundler.js'
      },
      // 优化模块解析
      extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue']
    },
    
    // 构建优化
    build: {
      // 启用源码映射（开发时）
      sourcemap: !isProd,
      
      // 代码分割优化
      rollupOptions: {
        external: [
          'axios-mock-adapter',
          'mockjs'
        ],
        
        output: {
          // 手动代码分割
          manualChunks: {
            // Vue相关库
            'vue-vendor': ['vue', 'vue-router', 'pinia'],
            // UI库
            'element-plus': ['element-plus'],
            // HTTP客户端
            'axios': ['axios']
          },
          
          // 文件名优化
          chunkFileNames: isProd ? 'assets/js/[name]-[hash].js' : 'assets/js/[name].js',
          entryFileNames: isProd ? 'assets/js/[name]-[hash].js' : 'assets/js/[name].js',
          assetFileNames: isProd ? 'assets/[ext]/[name]-[hash].[ext]' : 'assets/[ext]/[name].[ext]'
        }
      },
      
      // 构建目标优化
      target: 'es2015',
      
      // 启用CSS代码分割
      cssCodeSplit: true,
      
      // 压缩配置
      minify: isProd ? 'terser' : false,
      
      // Terser压缩选项
      terserOptions: isProd ? {
        compress: {
          drop_console: true, // 移除console
          drop_debugger: true, // 移除debugger
          pure_funcs: ['console.log'] // 移除console.log
        }
      } : undefined,
      
      // 块大小警告限制
      chunkSizeWarningLimit: 1000
    },
    
    // 依赖预构建优化
    optimizeDeps: {
      // 预构建包含的依赖
      include: [
        'vue',
        'vue-router',
        'pinia',
        'element-plus',
        'axios',
        '@element-plus/icons-vue'
      ],
      // 排除的依赖
      exclude: ['axios-mock-adapter', 'mockjs']
    },
    
    // CSS优化
    css: {
      // 启用CSS代码分割
      devSourcemap: !isProd,
      
      // PostCSS配置
      postcss: {
        plugins: isProd ? [
          // 生产环境CSS优化
          require('autoprefixer'),
          require('cssnano')({
            preset: ['default', {
              discardComments: {
                removeAll: true,
              },
              normalizeWhitespace: true,
            }]
          })
        ] : [
          autoprefixer
        ]
      }
    },
    
    // 定义全局环境变量
    define: {
      __MOCK_ENABLED__: JSON.stringify(!isProd && process.env.VITE_MOCK_ENABLED === 'true'),
      // 优化Vue生产环境
      __VUE_PROD_DEVTOOLS__: !isProd,
      __VUE_OPTIONS_API__: true,
      __VUE_PROD_TIPS__: false
    },
    
    // 缓存优化
    cacheDir: '.vite',
    
    // 日志级别
    logLevel: isProd ? 'error' : 'info',
    
    // 清除控制台
    clearScreen: false
  }
})
